﻿#include <iostream>
using namespace std;
#include <vector>
#include<algorithm>
#include<string>
#include<math.h>

//菱形继承问题

//class A
//{
//public:
//	A(int a = 0)
//		:_a(a)
//	{}
//
//	int _a;
//};
//
//class B : virtual public A
//{
//public:
//	B(int b = 0)
//		:A()
//		,_b(b)
//	{}
//
//	int _b;
//};
//
//class C : virtual public A
//{
//public:
//	C(int c = 0)
//		:A()
//		, _c(c)
//	{}
//
//	int _c;
//};
//
//class D :public B,public C
//{
//public:
//	//D(int d = 0)
//	//	:B()
//	//	, C()
//	//	, _d(d)
//	//{}
//
//	int _d;
//};
//
//
//int main()
//{
//	D d;
//	d.B::A::_a = 1;
//	d.C::A::_a = 2;
//	d._b = 3;
//	d._c = 4;
//	d._d = 5;
//
//	B* ptrb = &d;
//	
//
//	return 0;
//}



//class A
//{
//public:
//	A(int a = 0)
//		:_a(a)
//	{
//		cout << _a << endl;
//	}
//
//	int _a;
//};
//
//class B : virtual public A
//{
//public:
//	B(int a = 0,int b = 0)
//		: A(a)
//		,_b(b)
//	{
//		cout << _b << endl;
//	}
//
//	int _b;
//};
//
//class C : virtual public A
//{
//public:
//	C(int a = 0,int c = 0)
//		: A(a)
//		, _c(c)
//	{
//		cout << _c << endl;
//	}
//
//	int _c;
//};
//
////最先实例化的一定是父类，如果是多继承，实例顺序与继承顺序有关，如果是菱形继承最先实例化的一定是共同继承的父类，然后根据继承顺序实例化其他父类
//// 所以父类实例化的顺序与初始化列表顺序也无关
////class D :public B,public C
//class D :public C, public B
//{
//public:
//	D(int a = 0,int b = 0, int c = 0, int d = 0)
//		: C(a, c)
//		, B(a, b)
//		, A(a)
//		, _d(d)
//	{
//		cout << _d << endl;
//	}
//
//	int _d;
//};
//
//int main()
//{
//	D d(1, 2, 3, 4);
//	return 0;
//}

//class Person
//{
//public:
//	virtual void ID() const
//	{
//		cout << "我是普通人" << endl;
//	}
//};
//
//class Teacher : public Person
//{
//public:
//	virtual void ID() const
//	{
//		cout << "我是老师" << endl;
//	}
//};
//
//class Students : public Person
//{
//public:
//	virtual void ID() const
//	{
//		cout << "我是学生" << endl;
//	}
//};
//
//void speak(const Person& p)
//{
//	p.ID();
//}
//
////初识多态 - 不同对象表现不同状态
//int main()
//{
//	speak(Person());
//	speak(Teacher());
//	speak(Students());
//	return 0;
//}


//class A 
//{
//private:
//	~A() {}
//
//	
//public:
//	A() {}
//};
//
//int main()
//{
//	//设置析构函数为私有则A类只能通过new创建对象，因为对象A在栈上建立对象时需要检查析构函数是否可用
//	A a;
//}



